package cn.design.realize;

import java.util.HashMap;
import java.util.Map;

/**
 * @author dlq
 * @description FlyweightFactory:
 *             创建并管理享元对象，将各种具体享元类存储到一个享元池中，享元池一般为“键值对”集合，可以结合工厂模式进行设计。当用户请求一个具体享元对象时，
 *             享元池中如果保存的有就直接返回给用户，如果没有就创建该享元对象返回给用户并存储到享元池中
 *             维护享元池，类似 英雄池一样
 * @date 2020/9/22 10:18
 * @since 1.0
 */
public class FlyweightFactory {

    /**
     * 享元池,类似于英雄池--缓存池
     * static  final 保证数据是不变的 在这个应用程序中是一致的
     */
    private  static  final Map<String,Flyweight> tyPeMap = new HashMap<>();

    /**
     * @description 类似于 工厂模式
     *       享元池中如果保存的有就直接返回给用户，如果没有就创建该享元对象返回给用户并存储到享元池中
     * @param type
     * @return cn.design.realize.Flyweight
     * @author dlq
     * @date 2020/9/22 10:24
     */
    public static  Flyweight getFlyweight(String type){
        if (tyPeMap.containsKey(type)){
            return tyPeMap.get(type);
        }else {
            Flyweight flyweight = new ConcreteFlyweight(type);
            tyPeMap.put(type,flyweight);
            return flyweight;
        }
    }

    public static Integer getTotal(){
        return tyPeMap.size();
    }
}
